ss = 0
'''
可变参数：又分为【个数可变的位置参数】和【个数可变的关键字参数】两种，其中
个数可变的位置参数是在参数前加一颗星 (*para) ，para形式
参数的名称，函数调用时可接收任意个数的实际参数，并放到一
个【元组】中。个数可变的关键字参数是在参数前加两颗星(**para)
在函数调用时可接收任意多个“参数=值”形式的参数，并放到
一个【字典】中。

个数可变的位置参数：在形参名前面加*,在函数接收时，视作为一个【元组】
    当传入的数据为一个元组/列表时，可以用*进行解包
    
个数可变的关键字参数：在形参名前面加**,在函数接收时，视作为一个【字典】
    当传入的数据为一个字典时，可以用**进行解包
'''


# 个数可变的位置参数
def fun(*k):
    print(k, type(k))  # 元组
    for i in k:
        print(i)


# 调用
fun(1, 2, 3, 4, 5)
fun(10)
fun(20, 30)
fun([10, 20, 30])  # 传入列表时，会视作一个元素，实际上是一个参数
# 在调用时，参数前加一颗星*，会将列表进行解包
fun(*[10, 20, 30])  # 会将列表中的每一个元素，作为独立的元素添加到参数中
fun(*(1, 2, 3, 4))


# 个数可变的关键字参数

def fun2(**k):
    print(k, type(k))  # 字典
    for key, value in k.items():
        print(key, '====>', value)


# 调用
fun2(a=1, b=2, c=3)  # 关键字参数
fun2(a=1, b=2)  # 关键字参数

d = {'name': '大表哥', 'age': 18, 'height': 180}
fun2(d)  # 传入了一个位置参数，报错：TypeError: fun2() takes 0 positional arguments but 1 was given
fun2(**d)  # 传入了一个关键字参数，解包
